package org.example.utils;


import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;

public class JsonSortUtil {

    public static void main(String[] args)  {

        String jsonStr = "{ \n" +
                "\"data\":{\"appId\":\"43AF047BBA47FC8A1AE8EFB232BDBBCB\",\"appUserId\":\"o8z4C5avQXqC0aWFPf1Mzu6D7 \n" +
                "WCQ_bd\",\"idNo\":\"350181199011193519\",\"idType\":\"01\",\"phoneNumber\":\"13763873033\",\"userName\": \n" +
                "\"测试\"}, \n" +
                "\"appId\":\"43AF047BBA47FC8A1AE8EFB232BDBBCB\", \n"+
                "\"encType\":\"SM4\",\n" +
                "\"signType\":\"SM2\", \n" +
                "\"timestamp\":\"20200207175759\", \n" +
                "\"version\":\"1.0.0\" \n" +
                "} ";

        System.out.println(jsonStr);
        JSONObject jsonObject=JsonSortUtil.startSort((JSONObject) JSONObject.parse(jsonStr));
        System.out.println(String.format("排序前：%s", jsonStr));
        System.out.println(String.format("排序后：%s",jsonObject ));
//        String reString="";
//        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
//            if (entry.getKey()!="signData"&&entry.getKey()!="encData"&&entry.getKey()!="extra"){
//                reString=reString+entry.getKey()+"=";
//                reString=reString+entry.getValue()+"&";
//            }
//
//        }


    }

    public String createJsonString() throws ExecutionException, InterruptedException{
        JSONObject jsonObj = new JSONObject();
//            Map<String, String> ingredients = new HashMap<String, String>();
        jsonObj.put("project", "nio_business_prod");
        jsonObj.put("sugar", "1kg");
        jsonObj.put("pastry", "2.4kg");
        jsonObj.put("bestEaten", "outdoors");
        System.out.println(jsonObj);
        String json_to_string = JSONObject.toJSONString(jsonObj);
        return json_to_string;
    }
    /**
     * 对单词列表进行冒泡排序
     * 直接操作对象地址 无需返回
     *
     * @param words ["name","age"]
     */
    private static void wordSort(ArrayList<String> words) {
        for (int i = words.size() - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (words.get(j).compareToIgnoreCase(words.get(j + 1)) > 0) {
                    String temp = words.get(j);
                    words.set(j, words.get(j + 1));
                    words.set(j + 1, temp);
                }
            }
        }
    }

    /**
     * 对单层json排序
     *
     * @param json
     */
    private static JSONObject getAloneKeys(JSONObject json) {
        ArrayList<String> aloneKeys = new ArrayList<>();
        for (String key : json.keySet()) {
            aloneKeys.add(key);
        }
        // 排序
        JsonSortUtil.wordSort(aloneKeys);
        // 整理排序后的json
        JSONObject newJson = new JSONObject(new LinkedHashMap<>());
        for (String key : aloneKeys) {
            newJson.put(key, json.get(key));
        }
        return newJson;
    }

    /**
     * 递归每一层（当前是判断下一层是JSONObject类型的场景）
     *
     * @param json
     * @return
     */
    private static JSONObject getAloneKeysRec(JSONObject json) {
        JSONObject newJson = getAloneKeys(json);

        for (Map.Entry<String, Object> entry : newJson.entrySet()) {
            // JSONObject类型
            if (entry.getValue().getClass().equals(JSONObject.class)) {
                newJson.put(entry.getKey(), getAloneKeysRec((JSONObject) entry.getValue()));
            }
        }

        return newJson;
    }

    /**
     * 对JSONObject的key根据首字母排序 若首字母相同对比下一个字母 依次类推
     * 备注：当前未覆盖JSONArray的场景
     *
     * @param json
     * @return 排序后的新json
     */
    public static JSONObject startSort(JSONObject json) {
        // 第1层
        JSONObject jsonAlone = getAloneKeys(json);
        // 第2-n层
        for (Map.Entry<String, Object> entry : jsonAlone.entrySet()) {
            // 这里仅判断JSONObject类型的场景（若需要覆盖JSONArray场景 对应添加即可）
            if (entry.getValue().getClass().equals(JSONObject.class)) {
                jsonAlone.put(entry.getKey(), getAloneKeysRec((JSONObject) entry.getValue()));
            }
        }
        return jsonAlone;
    }

    public static String getKeyValue(JSONObject json){
        //fastjson解析方法
       return "";

    }
}
